package reflect;


import bean.Person;

import java.lang.reflect.Constructor;

public class ReflectDemo3 {

    /**
     Class对象功能：
         * 获取功能：
         1. 获取成员变量们
             * Field[] getFields()          //获取所有public修饰的成员变量
             * Field getField(String name)  //获取指定名称的 public修饰的成员变量

             * Field[] getDeclaredFields()  //取所有的成员变量,不考虑修饰符
             * Field getDeclaredField(String name) //获取指定名称的成员变量,不考虑修饰符
         2. 获取构造方法们
             * Constructor<?>[] getConstructors()  //获取所有的构造方法
             * Constructor<T> getConstructor(类<?>... parameterTypes)  //获取有参构造,参数不填就是无参的;

             * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
             * Constructor<?>[] getDeclaredConstructors()
         3. 获取成员方法们：
             * Method[] getMethods()
             * Method getMethod(String name, 类<?>... parameterTypes)

             * Method[] getDeclaredMethods()
             * Method getDeclaredMethod(String name, 类<?>... parameterTypes)

         4. 获取类名
             * String getName()



     */

    public static void main(String[] args) throws Exception {

        //0.获取Person的Class对象
        Class personClass = Person.class;

        Object o = personClass.newInstance(); //通过Class对象创建类对象
        System.out.println(o);
        /*
            2. 获取构造方法们
                 * Constructor<?>[] getConstructors()
                 * Constructor<T> getConstructor(类<?>... parameterTypes)

                 * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
                 * Constructor<?>[] getDeclaredConstructors()
         */
        //Constructor<T> getConstructor(类<?>... parameterTypes)
        Constructor constructor = personClass.getConstructor(String.class, int.class); // 获取有参构造器,参数不填就是无参的;
        System.out.println(constructor);
        Object person = constructor.newInstance("张三", 23); //通过有参构造创建对象,参数不填就是无参的;
        System.out.println(person);

        System.out.println("----------------------------------");

        Constructor constructor1 = personClass.getConstructor();  //获取无参构造器
        System.out.println(constructor1);
        //创建对象
        Object person1 = constructor1.newInstance();  //通过无参构造创建对象
        System.out.println(person1);



        //constructor1.setAccessible(true);  //暴力反射一样的
    }


}
